﻿using System;
using System.Collections.ObjectModel;
using Oracle.DataAccess.Client;

namespace ISHotelApp.Database
{
    [Serializable]
    public class SeznamHostuTable : DbTable
    {
        public static String TABLE_NAME = "Seznam_hostu";

        public String SQL_SELECT = "SELECT * FROM Seznam_hostu";
        public String SQL_SELECT_rodne_cislo = "SELECT * FROM Seznam_hostu WHERE rodne_cislo=:rodne_cislo AND id_pobytu=:id_pobytu";
        public String SQL_SELECT_id_pobytu = "SELECT * FROM Seznam_hostu WHERE id_pobytu=:id_pobytu";
        public String SQL_INSERT = "INSERT INTO Seznam_hostu (rodne_cislo, id_pobytu) VALUES (:rodne_cislo, :id_pobytu)";
        public String SQL_DELETE = "DELETE FROM Seznam_hostu WHERE rodne_cislo=:rodne_cislo AND id_pobytu=:id_pobytu";

        public SeznamHostuTable()
            : base(TABLE_NAME)
        {
        }

        /**
 * Insert the record.
 **/
        public int Insert(SeznamHostu SeznamHostu)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_INSERT);
            PrepareCommand(command, SeznamHostu);
            int ret = mDatabase.Insert(command);
            mDatabase.Close();
            return ret;
        }

        /**
         * Prepare a command.
         **/

        private void PrepareCommand(OracleCommand command, SeznamHostu SeznamHostu)
        {
            command.Parameters.Add(new OracleParameter(":" + SeznamHostu.ATTR_rodne_cislo, OracleDbType.Varchar2, SeznamHostu.rodne_cislo.Length));
            command.Parameters[":" + SeznamHostu.ATTR_rodne_cislo].Value = SeznamHostu.rodne_cislo;

            command.Parameters.Add(new OracleParameter(":" + SeznamHostu.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + SeznamHostu.ATTR_id_pobytu].Value = SeznamHostu.id_pobytu;
        }

        /**
         * Select records.
         **/
        public Collection<SeznamHostu> Select()
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_SELECT);
            OracleDataReader reader = mDatabase.Select(command);

            Collection<SeznamHostu> SeznamHostus = Read(reader);
            reader.Close();
            mDatabase.Close();
            return SeznamHostus;
        }

        /**
         * Select the record.
         **/
        public SeznamHostu Select(int id_pobytu)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_SELECT_id_pobytu);
            
            command.Parameters.Add(new OracleParameter(":" + SeznamHostu.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + SeznamHostu.ATTR_id_pobytu].Value = id_pobytu;

            OracleDataReader reader = mDatabase.Select(command);

            Collection<SeznamHostu> SeznamHostus = Read(reader);
            SeznamHostu SeznamHostu1 = null;
            if (SeznamHostus.Count == 1)
            {
                SeznamHostu1 = SeznamHostus[0];
            }
            reader.Close();
            mDatabase.Close();
            return SeznamHostu1;
        }

        private Collection<SeznamHostu> Read(OracleDataReader reader)
        {
            Collection<SeznamHostu> SeznamHostus = new Collection<SeznamHostu>();

            while (reader.Read())
            {
                SeznamHostu SeznamHostu = new SeznamHostu();
                SeznamHostu.id_pobytu = (int)reader.GetDecimal(0);
                SeznamHostu.rodne_cislo = reader.GetString(1);
                SeznamHostus.Add(SeznamHostu);
            }
            return SeznamHostus;
        }

        /**
         * Delete the record.
         */
        public int Delete(String rodne_cislo, int id_pobytu)
        {
            mDatabase.Connect();
            OracleCommand command = mDatabase.CreateCommand(SQL_DELETE);

            command.Parameters.Add(new OracleParameter(":" + SeznamHostu.ATTR_rodne_cislo, OracleDbType.Varchar2));
            command.Parameters[":" + SeznamHostu.ATTR_rodne_cislo].Value = rodne_cislo;
            command.Parameters.Add(new OracleParameter(":" + SeznamHostu.ATTR_id_pobytu, OracleDbType.Decimal));
            command.Parameters[":" + SeznamHostu.ATTR_id_pobytu].Value = id_pobytu;

            int ret;
            try
            {
                ret = mDatabase.Delete(command);
            }
            catch (Exception e)
            {
                throw e;
            }
            mDatabase.Close();
            return ret;
        }
    }
}